home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cgraphix / graphix.c < prev    next >
Text File  |  1986-05-12  |  4KB  |  194 lines

  1. /* «RM120»«PL99999»«TS4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76» */
  2. #include    <stdio.h>
  3. #define    EXTERN    extern
  4. #include    <typedef.h>
  5.  
  6. #define IBMPCjr        0
  7. #define IBMCGA        1
  8. #define IBMEGA        2
  9. #define NoDisplay    3
  10.  
  11.  
  12. extern unsigned seg();
  13.  
  14.  
  15. int HardwarePresent()
  16. {
  17.     int        i, EquipFlag;
  18.     char    Info, EGASwitch;
  19.     int        HP;
  20.     struct regval    regs;
  21.  
  22.     HP = FALSE;
  23.     DisplayType = NoDisplay;
  24.     sysint(0x11, ®s, ®s);
  25.     EquipFlag = regs.ax;
  26.     regs.ax = 0x1200;
  27.     regs.bx = 0x0010;
  28.     sysint(0x10, ®s, ®s);
  29.     EGASwitch = regs.cx & 0x0ff;
  30.     Info = (regs.bx >> 16);
  31.  
  32.     if (peek(0xfffe, 0xf000) == 0x0fd) {/* «MDBU»PCjr«MDNM»                             */
  33.         MinForeground = 0;                /* Actually only 0 and 15 are valid    */
  34.         MaxForeground = 15;
  35.         MinBackground = 0;
  36.         MaxBackground = 15;
  37.         DisplayType = IBMPCjr;
  38.         HP = TRUE;
  39.     }
  40.     else if (((EquipFlag & 52) == 0 ||
  41.               (EquipFlag & 52) == 16 ||
  42.               (EquipFlag & 52) == 32) &&
  43.               Info == 0) {                /* «MDBU»EGA present, active, and in color«MDNM»    */
  44.         MinForeground = 0;
  45.         MaxForeground = 15;
  46.         MinBackground = 0;
  47.         MaxBackground = 15;
  48.         DisplayType = IBMEGA;
  49.         HP = TRUE;
  50.     }
  51.     if (!HP)
  52.         if (((EquipFlag & 48) == 16 || (EquipFlag & 48) == 32) ||  /* «MDBU»CGA«MDNM»    */
  53.             ((EquipFlag & 52) == 4 &&        /* «MDBU»EGA present but not active«MDNM»    */
  54.                (EGASwitch == 4 || EGASwitch == 5 || EGASwitch == 10 ||
  55.               EGASwitch == 11))) {             /* «MDBU»EGA is mono, CGA for color«MDNM»    */
  56.             MinForeground = 0;
  57.             MaxForeground = 15;
  58.             MinBackground = 0;
  59.             MaxBackground = 0;
  60.             DisplayType = IBMCGA;
  61.             HP = TRUE;
  62.         }
  63.     return(HP);
  64. }
  65.  
  66. int AllocateRAMScreen()
  67. {
  68.     extern char    *calloc();
  69.     char        *screen;
  70.  
  71.     if (NULL == (screen = calloc(2 * ScreenSizeGlb + 16, 1)))
  72.         return(-1);                    /* not enough memory available for a    */
  73.                                     /*    RAM screen                            */
  74.  
  75.     while (ofs(screen) != 0)         /* Make absolutely certain that            */
  76.         screen++;                    /* ScreenGlb is on a segment boundary!    */
  77.  
  78.     ScreenGlb = seg(screen);
  79.     return(0);
  80.  
  81. }
  82.  
  83.  
  84. void LeaveGraphic()
  85. {
  86.     struct regval    regs;
  87.  
  88.     regs.ax = SaveStateGlb;
  89.     sysint(0x10, ®s, ®s);
  90.     GrafModeGlb = FALSE;
  91. }
  92.  
  93.  
  94. void SetIBMPalette(PaletteNumber, Color)
  95. int        PaletteNumber, Color;
  96. {
  97.     struct regval    regs;
  98.  
  99.     if (PaletteNumber != 2) {
  100.         regs.ax = 0x0B00;
  101.         regs.bx = PaletteNumber * 256 + Color;
  102.     }
  103.     else {
  104.         regs.ax = 0x1000;
  105.         regs.bx = Color * 256 + 1;
  106.     }
  107.     sysint(0x10, ®s, ®s);
  108. }
  109.  
  110.  
  111. void SetForegroundColor(Color)
  112. int        Color;
  113. {
  114.     switch (DisplayType) {
  115.         case IBMPCjr:
  116.             SetIBMPalette(1,1-(Color & 1));
  117.             break;
  118.         case IBMCGA:
  119.             SetIBMPalette(0,Color);
  120.             break;
  121.         case IBMEGA:
  122.             SetIBMPalette(2,Color);
  123.         break;
  124.     }
  125.     ForegroundColorGlb = Color;
  126. }
  127.  
  128.  
  129. void SetBackgroundColor(Color)
  130. int        Color;
  131. {
  132.     switch (DisplayType) {
  133.       case IBMPCjr:
  134.       case IBMEGA:
  135.         SetIBMPalette(0,Color);
  136.         break;
  137.     }
  138.     if (DisplayType == IBMEGA)
  139.         SetIBMPalette(2,ForegroundColorGlb);
  140. }
  141.  
  142.  
  143. void EnterGraphic()
  144. {
  145.     struct regval    regs;
  146.     int                FontFile;
  147.  
  148.     if (!FontLoaded) {
  149.         if (0 > (FontFile = open("8x8.fon", BREAD))) {
  150.             fprintf(stderr, "Font file cannot be opened.\n");
  151.             inkey();
  152.             memset(Font, 0, 256 * 8);
  153.         }
  154.         else {
  155.             read(FontFile, Font, 256 * 8);
  156.             close(FontFile);
  157.         }
  158.         FontLoaded = TRUE;
  159.     }
  160.     regs.ax = 0x0f00;
  161.     sysint(0x10, ®s, ®s);
  162.     if (((regs.ax & 0xff) < 4) || (SaveStateGlb == 10))
  163.          SaveStateGlb = regs.ax & 0xff;
  164.     regs.ax = 0x0006;
  165.     sysint(0x10, ®s, ®s);
  166.     SetForegroundColor(MaxForeground);
  167.     GrafModeGlb = TRUE;
  168. }
  169.  
  170.  
  171. void SetBackground8(Background)
  172. BackgroundArray    Background;
  173. {
  174.     int        i, j;
  175.  
  176.     for (i = Y1RefGlb; i <= Y2RefGlb; i++) {
  177.         for (j = 0; j < X2RefGlb-X1RefGlb+1; j++)
  178.             pokeb(BaseAddress(i) + X1RefGlb + j, GrafBase, Background[i & 7]);
  179.     }
  180. }
  181.  
  182.  
  183. void SetBackground(byt)
  184. unsigned char    byt;
  185. {
  186.     int        i;
  187.  
  188.     for (i = Y1RefGlb; i <= Y2RefGlb; i++)
  189.         filblock(BaseAddress(i)+X1RefGlb, GrafBase, byt, X2RefGlb-X1RefGlb+1);
  190.  
  191. }
  192.  
  193.  
  194.